﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AutoResetEvent上位机案例
{
    public class DeviceController
    {
        AutoResetEvent autoResetEvent =
            new AutoResetEvent(false);

        private int[] recvData = new int[3];

        public void StartWork()
        {
            //开启一个接收数据的线程
            Thread threadRecv = new Thread(RecvFunc);
            threadRecv.Start();

            while(true)
            {
                //等待接收数据线程的信号
                autoResetEvent.WaitOne();

                for (int i = 0; i < recvData.Length; i++)
                {
                    Console.WriteLine($"接收到数据:数组[{i}]:" + recvData[i].ToString());
                }
                Console.WriteLine("===========================================");

                //模拟界面更新延迟
                Thread.Sleep(2000);
            }
        }

        /// <summary>
        /// 接收数据函数
        /// </summary>
        /// <param name="obj"></param>
        /// <exception cref="NotImplementedException"></exception>
        private void RecvFunc(object? obj)
        {
            Random rnd = new Random();

            while(true)
            {
                // 模拟设备读取（耗时操作）
                Thread.Sleep(1500);

                // 生成模拟数据
                for (int i=0;i<recvData.Length;i++)
                {
                    recvData[i] = rnd.Next(1, 301);
                }

                //设置信号量，表示数据接收完毕，让主程序继续执行
                autoResetEvent.Set();
            }
        }
    }
}
